package com.coderman.infosys.auth.domain.gataway;

import java.util.List;

import com.coderman.infosys.plat.auth.common.page.PageBO;
import com.coderman.infosys.auth.domain.bo.system.MenuBO;
import com.coderman.infosys.auth.domain.bo.system.SystemBO;
import com.coderman.infosys.auth.domain.bo.system.ModuleBO;


/**
 * @Description:系统菜单按钮查询接口
 * @Author:shenshuai
 * @CreateTime:2022-01-02 15:27:38
 * @version v1.0
 * 这里叫查询网关，在eric的书里其实相当于规格(Secification)的实现
 * 根据查询场景的不同其实返回的可能不是聚合根对象，也就是说在对象遍历的时候
 * 不需要通过聚合根关系去逐步加载所有对象，因此也存在被滥用的可能，比如其他聚合(系统菜单权限)很有可能会通过查询的方式来
 * 直接访问到菜单和按钮，当然从领域模型上来说是不建议这么做的。
 *
 *
 */
public interface SystemModuleQueryGataWay{

	/**
	 *
	 * @Description 分页查询系统列表
	 * @param pageBO
	 * @return List<SystemBO>
	 *
	 * 比如这个接口，这个接口返回的是分页系统列表
	 * 但是内部可能不会去循环查找对应的菜单和按钮等关联数据
	 *
	 * 这就相当于规格模式在查询场景下的一个案例
	 * 在数据返回方面会令人疑惑，为什么返回的是SystemBO
	 * 那么现在针对于复杂多表查询场景可能需要独立一个repository实现，并内部维护一个多表查询的sql，
	 * 返回的模型不建议用BO类了
	 * 那么这种查询返回的对象是不是被领域驱动设计里忽略了，我们除了实体，值对象之外还需要一种东西来承载？
	 */
     List<SystemBO> querySystemPage(PageBO pageBO);

	/**
	 *
	 * @Description 分页查询菜单列表
	 * @return List<ModuleBO>
	 */
     List<ModuleBO> queryModulePage(PageBO pageBO);

	/**
	 *
	 * @Description 分页查询按钮列表
	 * @return List<ModuleBO>
	 */
	List<MenuBO> queryMenuPage(PageBO pageBO);

	/**
	 *
	 * @Description 根据条件查询系统
	 * @param search
	 * @return List<SystemBO>
	 */
     List<SystemBO> queryByCondition(String search);

	/**
	 *
	 * @Description 查询所有系统
	 * @return List<SystemBO>
	 */
	List<SystemBO> queryAll();


	/**
	 *
	 * @Description 根据code查询系统详情
	 * @param systemCode
	 * @return SystemBO
	 * 这里依然不会去关联查找菜单和按钮
	 */
     SystemBO getSystemByCode(String systemCode);

	/**
	 *
	 * @Description 根据code查询系统详情通过缓存查询
	 * @param systemCode
	 * @return SystemBO
	 * 这里依然不会去关联查找菜单和按钮
	 */
	SystemBO getSystemByCache(String systemCode);


	/**
	 *
	 * @Description 根据code查询菜单详情
	 * @param moduleCode
	 * @return ModuleBO
	 */
     ModuleBO getModuleByCode(String moduleCode);

	/**
	 *
	 * @Description 根据code查询按钮详情
	 * @param menuCode
	 * @return MenuBO
	 * 这里虽然也提供了通过code查询的接口
	 * 但是由于这个接口方法是在查询网关下定义的，
	 * 所以这种简单的查询其实也可能是一种定制化的查询或者查询网关本身就可以做定制化的简单查询
	 * 所以有时候返回的可能是menuBO的一个字段但是用MenuBO包装了
	 * 或者是直接就返回一个menuCode或者Name,当然也有时候是返回的是MenuBO对象
	 * 但是底层的查询sql是联表查的
	 *
	 * 所以根据读写接口的定性，每个接口方法的真正职责范围作用其实就不太一样了
	 *
	 */
     MenuBO getMenu(String menuCode);

	/**
	 *
	 * @Description 根据系统名称查询
	 * @param systemName
	 * @return List<SystemBO>
	 */
     SystemBO getSystemByName(String systemName);


	/**
	 * 根据系统编码获取菜单列表
	 * @param systemCode
	 * @return
	 */
	List<ModuleBO> getModuleBySystemCode(String systemCode);


}